//package com.aaa.spring.aspect;
//
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.*;
//import org.springframework.context.annotation.EnableAspectJAutoProxy;
//import org.springframework.stereotype.Component;
//
///**
// * 示例切面
// */
//@Aspect //标识这是个切面
//@Component //纳入spring管理
//@EnableAspectJAutoProxy //启用AOP切面代理
//public class DemoAspect {
//    //切入点
//    // 第一个*是标识任意返回值，包含void，
//    // 第二个*代表任意类名，
//    // 第三个*代表任意方法名
//    // ..代表所有类型的参数，包括无参
//    @Pointcut("execution(* com.aaa.spring.service.*.*(..))")
//    public void p1() {}
//
//    //前置通知（@Before）:设置当前通知方法与切入点之间的绑定关系，
//    //当前通知方法在原始切入点方法前运行
//    @Before("p1()")
//    public void print1(JoinPoint jp) {
//        //JoinPoint:获取目标对象中的相关信息    Joinpoint joinpoint
//        Object target = jp.getTarget();//目标对象
//        String name = jp.getSignature().getName();//方法签名的名字
//        Object[] params = jp.getArgs();//参数信息 有参数的话可以调用获取方法参数
//        System.out.println(target);
//        System.out.println(name);
////        System.out.println(params[0]);
//        System.out.println("会话开启....");
//    }
//
//    //后置通知（@After）：设置当前通知方法与切入点之间的绑定关系，当前通知方法在原始切入点方法后运行
//    @After("p1()")
//    public void after() {
//        System.out.println("会话关闭 ...");
//    }
//
//    //返回后的通知（@AfterReturning）:设置当前通知方法与切入点之间的绑定关系，当前通知方法在原始切入点方法正常执行完毕后运行
//    @AfterReturning(value = "p1()", returning = "result")
//    public void print2(JoinPoint jp, Object result) {
//        String name = jp.getSignature().getName();//方法签名的名字
//        System.out.println("返回后的通知:" + name + "结果:" + result);
//    }
//
////    //环绕通知（@Around）：设置当前通知方法与切入点之间的绑定关系，
////    // 当前通知方法在原始切入点方法前后运行
//    @Around("p1()")
//    public Object print3(ProceedingJoinPoint pjp) {
//        try {
//            System.out.println("环绕前:....");
//            return pjp.proceed();//执行目标方法
//        } catch (Throwable throwable) {
//            throwable.printStackTrace();
//        } finally {
//            System.out.println("环绕后....");
//        }
//        return null;
//    }
//
////    //抛出异常后的通知（@AfterThrowing）:设置当前通知方法与切入点之间的绑定关系，
////    //当前通知方法在原始切入点方法运行抛出异常后执行 全局异常处理
//    @AfterThrowing(value = "p1()", pointcut = "p1()", throwing = "e1")
//    public void print4(JoinPoint joinPoint, Exception e1) throws Exception {
//        System.out.println("抛出异常后的通知:" + e1);
//    }
//
//
//}
